package com.common.base.app.activity

import android.view.Gravity
import android.view.View
import androidx.viewbinding.ViewBinding
import com.common.base.R
import com.common.base.app.extras.no
import com.common.base.listener.AlertDialogConfirmBtnListener
import com.common.base.widget.CustomDialog
import com.common.base.widget.LoadingDialog
import java.lang.ref.WeakReference


/**
 * 作者：sosou
 * <p>
 * 版本：1.0
 * <p>
 * 创建日期：2022/8/19
 * <p>
 * 描述：
 * <p>
 * 修订历史：
 */
abstract class BaseVBActivity<VB : ViewBinding> : BaseActivity() {

    protected lateinit var mViewBinding: VB
    private var isLoaded = false

    /**
     * 两个按钮的自定义弹框
     */
    var twoBtnDialog: CustomDialog? = null

    var loadingDialog: WeakReference<LoadingDialog>? = null

    override fun initPre() {
        super.initPre()
        mViewBinding = getViewBinding()
    }

    override fun getLayoutResView(): View = mViewBinding.root

    abstract fun getViewBinding(): VB

    override fun onResume() {
        super.onResume()
        if (!isLoaded) {
            isLoaded = true
            lazyInitData()
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (twoBtnDialog?.isShowing == true) {
            twoBtnDialog?.dismiss()
        }
        if (loadingDialog?.get()?.isShowing() == true) {
            loadingDialog?.get()?.dismiss()
        }
    }

    open fun lazyInitData() {}

    /**
     * [简要描述]:自定义单按钮dialog点击OK后处理方法<br></br>
     * [详细描述]:空方法，给子类继承<br></br>
     */
    open fun onOneButtonOKClick() {}

    /**
     * [简要描述]:自定义两个按钮dialog点击OK后处理方法<br></br>
     * [详细描述]:空方法，给子类继承<br></br>
     */
    open fun onTwoButtonCancelClick() {}

    /**
     * [简要描述]:自定义两个按钮dialog点击OK后处理方法<br></br>
     * [详细描述]:空方法，给子类继承<br></br>
     */
    open fun onTwoButtonOKClick() {}

    /**
     * 自定义两个按钮无Msg dialog点击OK后处理方法
     */
    open fun onTwoButtonNoMsg() {}

    open fun getCustomDialog(): CustomDialog? {
        return twoBtnDialog
    }


    /**
     * 自定义dialog之两个按钮
     *
     * @param title   标题
     * @param message 内容
     */
    open fun showAlertDialogOneBtn(
        btnString: String?,
        title: String?,
        message: String?,
        isConstraint: Boolean,
        listener: AlertDialogConfirmBtnListener? =null
    ) :CustomDialog?{
        // 此处this改为getParent()，是因为，第一次安装apk，第一次打开会弹出该dialog提示升级信息，
        // 而集成支付SDK时，先会调到MMPay页面，弹升级dialog时的this即该IndexActivity会找不到，报错
        val dialogBuilder = CustomDialog.Builder(this)

        // 设置标题文字
        dialogBuilder.setTitle(title)

        // 设置提示栏文
        dialogBuilder.setMessage(message)
        dialogBuilder.setConstraint(isConstraint)
        dialogBuilder.setOneButton(
            btnString
        ) { dialog, which ->
            // 点击OK后处理方法
            dialog.dismiss()
            if(listener == null){
                onOneButtonOKClick()
            }else{
                listener.onConfirmBtnClick()
            }
        }
        if (twoBtnDialog?.isShowing ==true) {
            return twoBtnDialog
        }

        // 执行操作
        twoBtnDialog = dialogBuilder.create()
        twoBtnDialog?.setCancelable(isConstraint)

        if (twoBtnDialog?.isShowing ==false) {
            twoBtnDialog?.show()
        }
        return twoBtnDialog
    }

    /**
     * 自定义dialog之两个按钮
     *
     * @param title   标题
     * @param message 内容
     */
    open fun showAlertDialogTwoBtn(
        left: String?,
        right: String?,
        title: String?,
        message: String?,
        isConstraint: Boolean = false
    ) {
        // 此处this改为getParent()，是因为，第一次安装apk，第一次打开会弹出该dialog提示升级信息，
        // 而集成支付SDK时，先会调到MMPay页面，弹升级dialog时的this即该IndexActivity会找不到，报错
        val dialogBuilder = CustomDialog.Builder(
            this
        )

        // 设置标题文字
        dialogBuilder.setTitle(title)

        // 设置提示栏文
        dialogBuilder.setMessage(message)
        dialogBuilder.setConstraint(isConstraint)

        // 左键点击事件
        dialogBuilder.setPositiveButton(
            left
        ) { dialog, which ->

            /**
             * [简要描述]:左键点击事件<br></br>
             * [详细描述]:当用户点击左键时触发的事件<br></br>
             * @param dialog 对话框
             * @param which 按钮标识
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            onTwoButtonCancelClick()
            dialog.dismiss()
        }

        // 右键点击事件
        dialogBuilder.setNegativeButton(
            right
        ) { dialog, which ->
            /**
             * [简要描述]:右键点击事件<br></br>
             * [详细描述]:当用户点击右键时触发的事件<br></br>
             * @param dialog 提示
             * @param which 类型
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            // 返回到当前页面
            dialog.dismiss()

            // 点击OK后处理方法
            onTwoButtonOKClick()
        }
        if (twoBtnDialog != null && twoBtnDialog?.isShowing == true) {
            return
        }
        // 执行操作
        twoBtnDialog = dialogBuilder.create()
        if (twoBtnDialog?.isShowing == false) {
            twoBtnDialog?.show()
        }
    }

    /**
     * 自定义dialog之两个按钮
     *
     * @param title 标题
     * @param
     */
    open fun showAlertDialogTwoBtn(left: String?, right: String?, title: String?) {
        // 此处this改为getParent()，是因为，第一次安装apk，第一次打开会弹出该dialog提示升级信息，
        // 而集成支付SDK时，先会调到MMPay页面，弹升级dialog时的this即该IndexActivity会找不到，报错
        val dialogBuilder: CustomDialog.Builder = CustomDialog.Builder(
            this
        )

        // 设置标题文字
        dialogBuilder.setTitle(title)

        // 设置提示栏文
        dialogBuilder.setMessage("")
        dialogBuilder.setConstraint(true)

        // 左键点击事件
        dialogBuilder.setPositiveButton(
            left
        ) { dialog, which ->

            /**
             * [简要描述]:左键点击事件<br></br>
             * [详细描述]:当用户点击左键时触发的事件<br></br>
             * @param dialog 对话框
             * @param which 按钮标识
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            onTwoButtonCancelClick()
            dialog.dismiss()
        }

        // 右键点击事件
        dialogBuilder.setNegativeButton(
            right
        ) { dialog, which ->
            /**
             * [简要描述]:右键点击事件<br></br>
             * [详细描述]:当用户点击右键时触发的事件<br></br>
             * @param dialog 提示
             * @param which 类型
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            // 返回到当前页面
            dialog.dismiss()

            // 点击OK后处理方法
            onTwoButtonOKClick()
        }
        if (twoBtnDialog != null && twoBtnDialog?.isShowing == true) {
            return
        }

        // 执行操作
        twoBtnDialog = dialogBuilder.create()
        twoBtnDialog?.show()
    }

    /**
     * 自定义dialog之两个按钮
     *
     * @param msg
     * @param
     */
    open fun showAlertDialogTwoBtnMsg(left: String?, right: String?, msg: String?) {
        // 此处this改为getParent()，是因为，第一次安装apk，第一次打开会弹出该dialog提示升级信息，
        // 而集成支付SDK时，先会调到MMPay页面，弹升级dialog时的this即该IndexActivity会找不到，报错
        val dialogBuilder: CustomDialog.Builder =  CustomDialog.Builder(
            this
        )

        // 设置提示栏文
        dialogBuilder.setMessage(msg)
        dialogBuilder.setConstraint(true)

        // 左键点击事件
        dialogBuilder.setPositiveButton(
            left
        ) { dialog, which ->

            /**
             * [简要描述]:左键点击事件<br></br>
             * [详细描述]:当用户点击左键时触发的事件<br></br>
             * @param dialog 对话框
             * @param which 按钮标识
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            onTwoButtonCancelClick()
            dialog.dismiss()
        }

        // 右键点击事件
        dialogBuilder.setNegativeButton(
            right
        ) { dialog, which ->
            /**
             * [简要描述]:右键点击事件<br></br>
             * [详细描述]:当用户点击右键时触发的事件<br></br>
             * @param dialog 提示
             * @param which 类型
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            // 返回到当前页面
            dialog.dismiss()

            // 点击OK后处理方法
            onTwoButtonOKClick()
        }
        if (twoBtnDialog != null && twoBtnDialog?.isShowing==true) {
            return
        }
        // 执行操作
        twoBtnDialog = dialogBuilder.create()
        if (twoBtnDialog?.isShowing == false) {
            twoBtnDialog?.show()
        }
    }


    /**
     * 自定义dialog之两个按钮
     *
     * @param title   标题
     * @param message 内容
     */
    open fun showAlertDialogTwoBtn(
        left: String?,
        right: String?,
        title: String?,
        message: String?,
        message2: String?="",
        notCenter: Boolean = true,
        listener: AlertDialogConfirmBtnListener? =null
    ) :CustomDialog?{
        // 此处this改为getParent()，是因为，第一次安装apk，第一次打开会弹出该dialog提示升级信息，
        // 而集成支付SDK时，先会调到MMPay页面，弹升级dialog时的this即该IndexActivity会找不到，报错
        val dialogBuilder = CustomDialog.Builder(this)

        // 设置标题文字
        dialogBuilder.setTitle(title)

        // 设置提示栏文
        dialogBuilder.setMessage(message)

        dialogBuilder.setMessage2(message2)

        dialogBuilder.setConstraint(true)

        // 左键点击事件
        dialogBuilder.setPositiveButton(
            left
        ) { dialog, which ->

            /**
             * [简要描述]:左键点击事件<br></br>
             * [详细描述]:当用户点击左键时触发的事件<br></br>
             * @param dialog 对话框
             * @param which 按钮标识
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            if(listener == null){
                onTwoButtonCancelClick()
            }else{
                listener.onCancelBtnClick()
            }
            dialog.dismiss()
        }

        // 右键点击事件
        dialogBuilder.setNegativeButton(
            right
        ) { dialog, which ->
            /**
             * [简要描述]:右键点击事件<br></br>
             * [详细描述]:当用户点击右键时触发的事件<br></br>
             * @param dialog 提示
             * @param which 类型
             * @see android.content.DialogInterface.OnClickListener.onClick
             */
            // 返回到当前页面
            dialog.dismiss()

            if(listener == null){
                // 点击OK后处理方法
                onTwoButtonOKClick()
            }else{
                listener.onConfirmBtnClick()
            }
        }
        if (twoBtnDialog != null && twoBtnDialog?.isShowing == true) {
            return twoBtnDialog
        }
        // 执行操作
        twoBtnDialog = dialogBuilder.create()
        if (twoBtnDialog?.isShowing == false) {
            twoBtnDialog?.show()
        }

        notCenter.no {
            twoBtnDialog?.getMsgView()?.setGravity(Gravity.LEFT)
        }

        return twoBtnDialog
    }


    fun showDialogLoading(mCancelable: Boolean = true,content: String = resources.getString(R.string.loading_msg)) {
        if (loadingDialog == null) {
            loadingDialog = WeakReference(LoadingDialog.newInstance(content,mCancelable))
        }
        loadingDialog?.get()?.show(supportFragmentManager)
    }

    /**
     * 数据加载完成 成功/失败
     */
    open fun loadFinish() {
        dismissLoadingDialog()
    }

    open fun dismissLoadingDialog(){
        isFinishing.no { loadingDialog?.get()?.dismiss() }
    }
}